/*
 * Copyright (c) 2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * @file 日期工具
 */
import { systemDateTime } from '@kit.BasicServicesKit';
import { BusinessError } from '@kit.BasicServicesKit';

export async function sleep(time) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(time)
    }, time)
  })
}

export default class DateTimeUtil {
  getTime(): string {
    const DATETIME = new Date()
    return this.concatTime(DATETIME.getHours(), DATETIME.getMinutes())
  }

  getDate(): string {
    const DATETIME = new Date()
    return this.concatDate(DATETIME.getMonth() + 1, DATETIME.getDate())
  }

  fill(value: number) {
    return (value > 9 ? '' : '0') + value
  }

  concatDate(month: number, date: number) {
    return `${this.fill(month)}-${this.fill(date)}`
  }

  concatTime(hours: number, minutes: number) {
    return `${this.fill(hours)}:${this.fill(minutes)}`
  }
  static async nanotime() {
    try {
      let nano = await systemDateTime.getCurrentTime()
      return nano
    } catch (e) {
      let error = e as BusinessError;
      console.info(`Failed to get currentTime. message: ${error.message}, code: ${error.code}`);
      return 0
    }
  }
}
function timeit<T extends Function, rtnT, C, Args extends any[]>(color: string = 'magenta'): (target: C, propertyKey: string,
  descriptor: PropertyDescriptor) => void {
  return (target: C, propertyKey: string, descriptor: PropertyDescriptor): void => {
  const originalMethod: T = descriptor.value as T;
  descriptor.value = (...args: Args): rtnT => {
    const startTime: number = Date.now();
    // 直接调用原方法，不使用apply
    const result: rtnT = originalMethod(...args);
    const endTime: number = Date.now();
    const executionTime: number = (endTime - startTime) / 1000;
    console.log(`\x1b[34m${propertyKey} 执行时间为：${executionTime}秒\x1b[0m`);
    return result;
  };
};
}
